{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 微调树的参数：max_depth & min_child_weight\n",
    "(微调，将步长降为1，进行精细调整)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# path to where the data lies\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath +\"RentListingInquries_FE_train.csv\")\n",
    "# train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train['interest_level']\n",
    "\n",
    "train = train.drop(['interest_level'], axis=1, inplace = False)\n",
    "X_train = train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 训练样本6w+，交叉验证太慢，用train_test_split估计模型性能\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_val, y_train_part, y_val = train_test_split(X_train, y_train, train_size = 0.2,random_state = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train_part.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "各类样本不均衡，交叉验证是采用StratifiedKFold，在每折采样时各类样本按比例采样"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': [6, 7, 8], 'min_child_weight': [4, 5, 6]}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "max_depth = [3,4,5]\n",
    "min_child_weight = [0,1,2]\n",
    "param_test2_1 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.63739, std: 0.01926, params: {'max_depth': 6, 'min_child_weight': 4},\n",
       "  mean: -0.63917, std: 0.01740, params: {'max_depth': 6, 'min_child_weight': 5},\n",
       "  mean: -0.63699, std: 0.01620, params: {'max_depth': 6, 'min_child_weight': 6},\n",
       "  mean: -0.64694, std: 0.01873, params: {'max_depth': 7, 'min_child_weight': 4},\n",
       "  mean: -0.64432, std: 0.01652, params: {'max_depth': 7, 'min_child_weight': 5},\n",
       "  mean: -0.64292, std: 0.01624, params: {'max_depth': 7, 'min_child_weight': 6},\n",
       "  mean: -0.66361, std: 0.01783, params: {'max_depth': 8, 'min_child_weight': 4},\n",
       "  mean: -0.65775, std: 0.02151, params: {'max_depth': 8, 'min_child_weight': 5},\n",
       "  mean: -0.64967, std: 0.01970, params: {'max_depth': 8, 'min_child_weight': 6}],\n",
       " {'max_depth': 6, 'min_child_weight': 6},\n",
       " -0.6369940615476982)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=250,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch2_1 = GridSearchCV(xgb2_1, param_grid = param_test2_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch2_1.fit(X_train_part , y_train_part)\n",
    "\n",
    "gsearch2_1.grid_scores_, gsearch2_1.best_params_,     gsearch2_1.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([232.95356636, 188.88126431, 177.60024428, 201.45220881,\n",
       "        175.01064963, 174.81984458, 223.58720474, 225.53286786,\n",
       "        200.84071045]),\n",
       " 'std_fit_time': array([19.18172728,  3.52827574,  5.70607889,  1.30397639, 10.25350356,\n",
       "        19.5659412 ,  1.14380705,  1.6692485 , 36.39136015]),\n",
       " 'mean_score_time': array([0.44221702, 0.3376977 , 0.33410683, 0.42137637, 0.32523937,\n",
       "        0.39564829, 0.48960218, 0.48771853, 0.34323382]),\n",
       " 'std_score_time': array([0.09531591, 0.02278422, 0.01567988, 0.01874187, 0.02616922,\n",
       "        0.02695878, 0.0215067 , 0.02871875, 0.08924294]),\n",
       " 'param_max_depth': masked_array(data=[6, 6, 6, 7, 7, 7, 8, 8, 8],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_min_child_weight': masked_array(data=[4, 5, 6, 4, 5, 6, 4, 5, 6],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'max_depth': 6, 'min_child_weight': 4},\n",
       "  {'max_depth': 6, 'min_child_weight': 5},\n",
       "  {'max_depth': 6, 'min_child_weight': 6},\n",
       "  {'max_depth': 7, 'min_child_weight': 4},\n",
       "  {'max_depth': 7, 'min_child_weight': 5},\n",
       "  {'max_depth': 7, 'min_child_weight': 6},\n",
       "  {'max_depth': 8, 'min_child_weight': 4},\n",
       "  {'max_depth': 8, 'min_child_weight': 5},\n",
       "  {'max_depth': 8, 'min_child_weight': 6}],\n",
       " 'split0_test_score': array([-0.64042903, -0.64513805, -0.63816169, -0.64288849, -0.63772246,\n",
       "        -0.64636057, -0.66167945, -0.65329628, -0.64183032]),\n",
       " 'split1_test_score': array([-0.65917528, -0.65541602, -0.65546247, -0.67336879, -0.6624597 ,\n",
       "        -0.66237467, -0.68777824, -0.68779975, -0.67549666]),\n",
       " 'split2_test_score': array([-0.64886869, -0.65191378, -0.6485649 , -0.65866887, -0.66434767,\n",
       "        -0.65737066, -0.67622486, -0.67280393, -0.66840305]),\n",
       " 'split3_test_score': array([-0.6022163 , -0.60685073, -0.60819603, -0.61723574, -0.62174376,\n",
       "        -0.62090342, -0.63533432, -0.62440386, -0.62166441]),\n",
       " 'split4_test_score': array([-0.63624726, -0.63654696, -0.63458343, -0.64255272, -0.63533765,\n",
       "        -0.62757048, -0.65702662, -0.65046928, -0.64093686]),\n",
       " 'mean_test_score': array([-0.63738773, -0.63917397, -0.63699406, -0.64694295, -0.64432249,\n",
       "        -0.64291784, -0.66360916, -0.6577549 , -0.64966635]),\n",
       " 'std_test_score': array([0.01925665, 0.01739761, 0.01619546, 0.01872993, 0.01651687,\n",
       "        0.01624419, 0.01783144, 0.02151465, 0.0196976 ]),\n",
       " 'rank_test_score': array([2, 3, 1, 6, 5, 4, 9, 8, 7]),\n",
       " 'split0_train_score': array([-0.3110163 , -0.32658628, -0.33792401, -0.25387447, -0.27602151,\n",
       "        -0.28888658, -0.21574825, -0.2367256 , -0.25463923]),\n",
       " 'split1_train_score': array([-0.3081527 , -0.32266221, -0.33404852, -0.2535742 , -0.26901567,\n",
       "        -0.28766118, -0.21606883, -0.23523429, -0.25351572]),\n",
       " 'split2_train_score': array([-0.31434866, -0.32777634, -0.33758138, -0.25350975, -0.2719365 ,\n",
       "        -0.28751199, -0.21334174, -0.23195152, -0.25239823]),\n",
       " 'split3_train_score': array([-0.31854984, -0.33172938, -0.34253578, -0.25972508, -0.27816528,\n",
       "        -0.29313078, -0.22087302, -0.23813176, -0.25873641]),\n",
       " 'split4_train_score': array([-0.31154156, -0.32355341, -0.33608656, -0.25921469, -0.27836485,\n",
       "        -0.29194234, -0.2211617 , -0.23864569, -0.25670197]),\n",
       " 'mean_train_score': array([-0.31272181, -0.32646152, -0.33763525, -0.25597964, -0.27470076,\n",
       "        -0.28982657, -0.21743871, -0.23613777, -0.25519831]),\n",
       " 'std_train_score': array([0.00351543, 0.00323687, 0.00280587, 0.002857  , 0.00366427,\n",
       "        0.00229452, 0.00307163, 0.00240633, 0.00226995])}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch2_1.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.636994 using {'max_depth': 6, 'min_child_weight': 6}\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAEMCAYAAADu7jDJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3XeclOW99/HPbzu7S106S1MhokgQETUGo7GADaXEiOVEn2M8J8bUo0d9TrHEJObJ61hjjB6jJiaKhhVCDCrFDkEExbZKERAWRKQssJStv+eP+55ldne278y27/v1mtfO3G2umS3fve7rmt9t7o6IiEhTJbV2A0REpH1TkIiISLMoSEREpFkUJCIi0iwKEhERaRYFiYiINEtcg8TMJpvZajNbZ2Y317LNJWaWb2YfmdlTUcuHmNkCM/s4XD8sXP6EmW0ws1XhbWw8X4OIiNTN4vU5EjNLBtYAZwMFwNvATHfPj9pmBPAs8E13321mfd19e7juVeDn7r7QzLKBCnc/YGZPAM+7++y4NFxERBolnj2SCcA6d1/v7iXALOCiatt8F3jQ3XcDRIXIMUCKuy8Mlxe5+4E4tlVERJoonkEyCNgc9bggXBZtJDDSzJaY2TIzmxy1vNDMnjOzd83s12EPJ+LnZva+md1jZunxewkiIlKflDge22Isq34eLQUYAZwO5AJvmNnocPlE4HhgE/AMcBXwe+AWYBuQBjwC3ATcUePJza4FrgXIyso64eijj27u6xER6VRWrly5w9371LddPIOkABgc9TgX2Bpjm2XuXgpsMLPVBMFSALzr7usBzGwucDLwe3f/PNy32MweB26I9eTu/ghB0DB+/HhfsWJFy7wqEZFOwsw+a8h28Ty19TYwwsyGm1kacCkwr9o2c4EzAMysN8EprfXhvj3NLJKE3wTyw+0GhF8NuBj4MI6vQURE6hG3Hom7l5nZ9cBLQDLwmLt/ZGZ3ACvcfV647hwzywfKgRvdfSeAmd0ALA4DYyXwv+Gh/xwGjAGrgH+N12sQEZH6xW36b1uiU1siIo1nZivdfXx928VzjERE2qHS0lIKCgo4dOhQazdFEiQjI4Pc3FxSU1ObtL+CRESqKCgooGvXrgwbNozgzLJ0ZO7Ozp07KSgoYPjw4U06hmptiUgVhw4dIicnRyHSSZgZOTk5zeqBKkhEpAaFSOfS3O+3Tm3V4dXNr1JeUc7JA08mKzWrtZsjItImKUjq8GT+kyzftpyUpBTG9R3H1wd9na8P+jpH9ThK/7GJiIR0aqsOvzv7dzw26TH+6Zh/orC4kLtX3s20edM4J+8cblt6G4s/W8z+0v2t3UyRDqWwsJDf/va3Tdr33nvv5cCBtlnf9fTTT6epH0OYO3cu+fmVhdMbfKzCwkJmzJjB0UcfzahRo/jHP/7RpOevj3okdUhNSuXE/idyYv8T+ckJP2Hb/m0s2bKEN7e8yYsbXyRvbZ56KyItLBIk1113XaP3vffee7niiivIzMyMQ8taz9y5c7ngggs45phjGrXfj370IyZPnszs2bMpKSmJW8gqSBqhf1Z/po+czvSR0ymtKGXV9lW8ueVN3tzyJnevvJu7V95N/6z+nDrwVCYOmqixFWn3bv/bR+Rv3duixzxmYDduvfDYWtfffPPNfPrpp4wdO5azzz6bvn378uyzz1JcXMzUqVO5/fbb2b9/P5dccgkFBQWUl5fzX//1X3zxxRds3bqVM844g969e/PKK6/EPH52djbf//73WbRoET179uQXv/gF//7v/86mTZu49957mTJlChs3buTKK69k//7gjMNvfvMbvva1rzFnzhwefPBBFi5cyLZt2/jGN77B66+/Tv/+/Ws8z8GDB7n66qvJz89n1KhRHDx4sHLdggULuPXWWykuLubII4/k8ccfJzs7m2HDhvHtb3+7su1PPfUU27dvZ968ebz22mvceeed5OXlAfCXv/yF6667jsLCQn7/+98zceLEKs+/d+9eXn/9dZ544gkA0tLSSEtLa/g3qhEUJE2k3opIfNx11118+OGHrFq1igULFjB79myWL1+OuzNlyhRef/11vvzySwYOHMjf//53APbs2UP37t25++67eeWVV+jdu3etx9+/fz+nn346v/rVr5g6dSr/+Z//ycKFC8nPz+c73/kOU6ZMoW/fvixcuJCMjAzWrl3LzJkzWbFiBVOnTiUvL48HH3yQF198kdtvvz1miAA89NBDZGZm8v777/P+++8zbtw4AHbs2MGdd97JokWLyMrK4le/+hV33303//3f/w1At27dWL58OX/84x/58Y9/zPPPP8+UKVO44IILmDFjRuXxy8rKWL58OfPnz+f2229n0aJFbN26lWuuuYb58+ezfv16+vTpw9VXX817773HCSecwH333UdWVsv/c6sgaSHqrUhHVFfPIREWLFjAggULOP744wEoKipi7dq1TJw4kRtuuIGbbrqJCy64oMZ/43VJS0tj8uTg0kfHHXcc6enppKamctxxx7Fx40Yg+HT/9ddfz6pVq0hOTmbNmjWV+z/wwAOMHj2ak08+mZkzZ9b6PK+//jo//OEPARgzZgxjxowBYNmyZeTn53PqqacCUFJSwimnnFK5X+SYM2fO5Cc/+Umtx582bRoAJ5xwQmW7Bw4cyPz584EgaN555x0eeOABTjrpJH70ox9x11138bOf/azB71VDKUjiQL0VkZbh7txyyy38y7/8S411K1euZP78+dxyyy2cc845lf/R1yc1NbXydy0pKYn09PTK+2VlZQDcc8899OvXj/fee4+KigoyMjIq99+yZQtJSUl88cUXVFRUkJRU+5ylWL/T7s7ZZ5/N008/Xe8+df1NiLQ7OTm5st3RcnNzyc3N5aSTTgJgxowZ3HXXXbUerzk0aysBIr2Ve864hzcufUMzwUTq0LVrV/bt2wfApEmTeOyxxygqKgKCP+Lbt29n69atZGZmcsUVV3DDDTfwzjvv1Ni3Ofbs2cOAAQNISkriySefpLy8HAj+y7/66qt56qmnGDVqFHfffXetxzjttNP485//DMCHH37I+++/D8DJJ5/MkiVLWLduHQAHDhyo0uN55plnKr9GeipNeV39+/dn8ODBrF69GoDFixc3erC+odQjSTD1VkTqlpOTw6mnnsro0aM599xzueyyyyr/oGZnZ/OnP/2JdevWceONN5KUlERqaioPPfQQANdeey3nnnsuAwYMqHWwvSGuu+46pk+fzl/+8hfOOOOMynGFX/ziF0ycOJGJEycyduxYTjzxRM4//3xGjRpV4xjf+973uPrqqxkzZgxjx45lwoQJAPTp04cnnniCmTNnUlxcDMCdd97JyJEjASguLuakk06ioqKistdy6aWX8t3vfpf777+f2bNn19ru6DESCE7DXX755ZSUlHDEEUfw+OOPN/k9qYvKyLch1cdW1uwO/kvR2Iok0scffxzzD6PE37Bhw1ixYkWdkwXiJdb3XWXk2yH1VkSkPVKPpJ1Qb0USpaP0SE466aTKU0cRTz75JMcdd1yLPs9LL73ETTfdVGXZ8OHDmTNnTos+T7w1p0ei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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch2_1.best_score_, gsearch2_1.best_params_))\n",
    "test_means = gsearch2_1.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_1.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_1.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_1.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch2_1.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_1.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(max_depth), len(min_child_weight))\n",
    "train_scores = np.array(train_means).reshape(len(max_depth), len(min_child_weight))\n",
    "\n",
    "for i, value in enumerate(max_depth):\n",
    "    pyplot.plot(min_child_weight, -test_scores[i], label= 'test_max_depth:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig('max_depth_vs_min_child_weght_1.png' )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
